home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 10
/
The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso
/
PC_SIGCD
/
05
/
6
/
DISK0564.ZIP
/
SOURCE.ARC
/
ASM.ARC
/
PRINTDD.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-11-01
|
4KB
|
114 lines
SUBTTL PRINTDD - PRINT A DOUBLE WORD IN DI:SI
PAGE
; This is a modified version of a routine from SDIR Version
; 2.4, by Ted Reuss (modified from a program by John Chapman), on
; PC-SIG Volume 185.
.XLIST
INCLUDE ASCII.DEF
INCLUDE MSDOS2.DEF
.LIST
DOSSEG
.MODEL SMALL
.DATA
LDZERO DB 1 DUP (?)
DOUBLE DB 8 DUP (20H)
DB '$'
DBLCNT DW 1 DUP (?)
.CODE
PUBLIC PRINTDD
PRINTDD PROC NEAR ;Prints a 32 bit integer in DI:SI
;AL = 0 to suppress leading 0's
; = "0" (60Q) to print leading 0's
; = " " (20Q) to print leading spaces
MOV BYTE PTR LDZERO,AL
MOV BX,OFFSET DOUBLE
MOV CX,8
FILL: MOV BYTE PTR [BX],SPACE ;FILL BUFFER WITH SPACES
INC BX
LOOP FILL
CALL PRINTDX ;format the double word into DOUBLE 2.4
MOV DX,OFFSET DOUBLE
MOV BX,DX
MOV CX,7 ;SUPPRESS LEADING 0'S
SUPP0: CMP BYTE PTR [BX],SPACE
JNE SPDONE
MOV AL,BYTE PTR LDZERO
AND AL,AL
JNZ SUPP2
INC DX
SUPP1:
MOV [BX],AL
SUPP2:
INC BX
LOOP SUPP0
SPDONE:
MOV AH,CON_STRING_OUTPUT
INT DOS ;print the digits 2.4
RET ;and return 2.4
PRINTDD ENDP ; 2.4
PRINTDX PROC NEAR ;converts integer in DI:SI to decimal 2.4
MOV WORD PTR DBLCNT,0 ;reset the offset for DOUBLE 2.4
XOR AX,AX ;Zero out the 2.4
MOV BX,AX ; working
MOV BP,AX ; registers.
MOV CX,32 ;# bits of precision
J1: SHL SI,1
RCL DI,1
XCHG BP,AX
CALL J6
XCHG BP,AX
XCHG BX,AX
CALL J6
XCHG BX,AX
ADC AL,0
LOOP J1
MOV CX,1710H ;5904 ?
MOV AX,BX
CALL J2
MOV AX,BP
J2: PUSH AX
MOV DL,AH
CALL J3
POP DX
J3: MOV DH,DL
SHR DL,1 ;Move high
SHR DL,1 ; nibble to
SHR DL,1 ; the low
SHR DL,1 ; position.
CALL J4
MOV DL,DH
J4: AND DL,0FH ;Mask low nibble
JZ J5 ;If not zero
MOV CL,0
J5: DEC CH
AND CL,CH
OR DL,'0' ;Fold in ASCII zero
SUB DL,CL
PUSH DI ;save DI 2.4
MOV DI,OFFSET DOUBLE ;point to DOUBLE 2.4
ADD DI,WORD PTR DBLCNT ;add current offset 2.4
INC WORD PTR DBLCNT ;bump offset for next time 2.4
MOV BYTE PTR DS:[DI],DL ;move next digit to DOUBLE 2.4
POP DI ;restore DI 2.4
RET ;Exit to caller
PRINTDX ENDP ; 2.4
J6 PROC NEAR
ADC AL,AL
DAA
XCHG AL,AH
ADC AL,AL
DAA
XCHG AL,AH
RET
J6 ENDP
END